package com.learn.finished;
//给你一个数组 orders，表示客户在餐厅中完成的订单，确切地说， orders[i]=[customerNamei,tableNumberi,foodItemi] ，其中 customerNamei 是客户的姓名，tableNumberi 是客户所在餐桌的桌号，而 foodItemi 是客户点的餐品名称。
//
//        请你返回该餐厅的 点菜展示表 。在这张表中，表中第一行为标题，其第一列为餐桌桌号 “Table” ，后面每一列都是按字母顺序排列的餐品名称。接下来每一行中的项则表示每张餐桌订购的相应餐品数量，第一列应当填对应的桌号，后面依次填写下单的餐品数量。
//
//        注意：客户姓名不是点菜展示表的一部分。此外，表中的数据行应该按餐桌桌号升序排列。
//        示例 1：
//
//        输入：orders = [["David","3","Ceviche"],["Corina","10","Beef Burrito"],["David","3","Fried Chicken"],["Carla","5","Water"],["Carla","5","Ceviche"],["Rous","3","Ceviche"]]
//        输出：[["Table","Beef Burrito","Ceviche","Fried Chicken","Water"],["3","0","2","1","0"],["5","0","1","0","1"],["10","1","0","0","0"]]
//        解释：
//        点菜展示表如下所示：
//        Table,Beef Burrito,Ceviche,Fried Chicken,Water
//        3    ,0           ,2      ,1            ,0
//        5    ,0           ,1      ,0            ,1
//        10   ,1           ,0      ,0            ,0
//        对于餐桌 3：David 点了 "Ceviche" 和 "Fried Chicken"，而 Rous 点了 "Ceviche"
//        而餐桌 5：Carla 点了 "Water" 和 "Ceviche"
//        餐桌 10：Corina 点了 "Beef Burrito"
//        示例 2：
//
//        输入：orders = [["James","12","Fried Chicken"],["Ratesh","12","Fried Chicken"],["Amadeus","12","Fried Chicken"],["Adam","1","Canadian Waffles"],["Brianna","1","Canadian Waffles"]]
//        输出：[["Table","Canadian Waffles","Fried Chicken"],["1","2","0"],["12","0","3"]]
//        解释：
//        对于餐桌 1：Adam 和 Brianna 都点了 "Canadian Waffles"
//        而餐桌 12：James, Ratesh 和 Amadeus 都点了 "Fried Chicken"
//        示例 3：
//        输入：orders = [["Laura","2","Bean Burrito"],["Jhon","2","Beef Burrito"],["Melissa","2","Soda"]]
//        输出：[["Table","Bean Burrito","Beef Burrito","Soda"],["2","1","1","1"]]
//

import java.util.*;

public class num_1418 {
    public static void main(String[] args) {
//        ArrayList<List<String>> list = new ArrayList<>();
//        list = [["Laura","2","Bean Burrito"],["Jhon","2","Beef Burrito"],["Melissa","2","Soda"]];
//        ArrayList<String> order = new ArrayList<>();
//        order=["Laura","2","Bean Burrito"];
        List<String> tables = new ArrayList<>();
        List<String> tables1 = new ArrayList<>();
        List<String> tables2 = new ArrayList<>();
        List<String> tables3 = new ArrayList<>();
//        List<String> foods = new ArrayList<>();
        List<List<String>> list = new ArrayList<>();
        tables.add("Lai");
        tables.add("2");
        tables.add("Baiqieji");

        tables1.add("Hua");
        tables1.add("2");
        tables1.add("HongShaoYu");

        tables2.add("HanHan");
        tables2.add("1");
        tables2.add("HongShaoYu");

        tables3.add("HanHan");
        tables3.add("1");
        tables3.add("Baiqieji");


        list.add(tables);
        list.add(tables1);
        list.add(tables2);
        list.add(tables3);

        //System.out.println(list);


        System.out.println(displayTable(list));
    }
    public static List<List<String>> displayTable(List<List<String>> orders) {
        //食品set集合
        Set<String> foodItemSet = new HashSet<>();
        //创建Map，第一层是桌号，第二层是食品表
        //每一座，点了什么食品，是第几号
        Map<Integer, Map<String, Integer>> tableOrderMap = new HashMap<>();
        for (List<String> order : orders) {
            //获取桌号
            int tableNum=Integer.parseInt(order.get(1));
            //获取食品名称
            String foodItem = order.get(2);
            //将食品名加入到食品set集合
            foodItemSet.add(foodItem);
            //getOrDefault方法：如果key->tableName存在于tableOrderMap中，则返回tableNum对应的value
            //如果tableNum不存在与tableOrderMap中，则为其创建一个新的哈希表，其中<key(String),value(Integer)>
            Map<String ,Integer> orderMap=tableOrderMap.getOrDefault(tableNum,new HashMap<String ,Integer>());
            //若foodItem的key存在，则count=0+1；
            int count = orderMap.getOrDefault(foodItem,0)+1;
            //orderMap顺序Map里，存入食物名称和count记号
            orderMap.put(foodItem,count);
            //tableOrderMap表里放入桌号以及食物Map表
            tableOrderMap.put(tableNum,orderMap);
        }
        //存放List的List->displayLists
        ArrayList<List<String>> displayLists = new ArrayList<>();
        //?
        List<String> foodItemList = new ArrayList<>(foodItemSet);
        //对食物名称列表进行排序
        Collections.sort(foodItemList);
        //创建了一个食物序列Map
        Map<String, Integer> itemIndexMap = new HashMap<>();
        //创建头，其实是输出逻辑表的那个头
        ArrayList<String> header = new ArrayList<>();
        header.add("Table");
        //读取食物列表的长度
        int size = foodItemList.size();
        for (int i = 0; i < size; i++) {
            //读取食物列表的食物名称
            String food = foodItemList.get(i);
            //加入到头列表中
            header.add(food);
            //食物索引表将食物以及索引存储到Map里
            itemIndexMap.put(food,i+1);

        }
        //将头表加入到展示表中
        displayLists.add(header);
        //创建身体表
        ArrayList<List<String>> bodyLists = new ArrayList<>();
        //创建了桌号集合，返回桌号顺序表中的key的集合set
        Set<Integer> tableSet = tableOrderMap.keySet();
        for (Integer tableNum : tableSet) {
            //currentLine
            ArrayList<String> curLine = new ArrayList<>();
            //将桌号加入到curLine里
            curLine.add(String.valueOf(tableNum));
            //int size = foodItemList.size();
            for (int i = 0; i < size; i++) {
                curLine.add("0");
            }
            Map<String, Integer> orderMap = tableOrderMap.get(tableNum);
            Set<String> curFoodSet = orderMap.keySet();
            for (String food : curFoodSet) {
                int count = orderMap.get(food);
                int index = itemIndexMap.get(food);
                curLine.set(index,String.valueOf(count));
            }
            bodyLists.add(curLine);
        }
        Collections.sort(bodyLists, new Comparator<List<String>>() {
            @Override
            public int compare(List<String> o1, List<String> o2) {
                int tableNum1=Integer.parseInt(o1.get(0));
                int tableNum2=Integer.parseInt(o2.get(0));
                return tableNum1-tableNum2;
            }
        });
        int tableCount = bodyLists.size();
        for (int i = 0; i < tableCount; i++) {
            displayLists.add(bodyLists.get(i));
        }


        return displayLists;
    }
}
